GD32的flash读、擦除、写操作 您所在的位置:网站首页 stm32 gd32 GD32的flash读、擦除、写操作

GD32的flash读、擦除、写操作

#GD32的flash读、擦除、写操作| 来源: 网络整理| 查看: 265

GD32的flash特征

1、在flash的前256K字节空间内,CPU执行指令零等待;在此范围外,CPU读取指令存在较长延时; 2、对于flash大于512KB(不包括等于512KB)的GD32F10x_CL和GD32F10x_XD,使用了两片闪存;前512KB容量在第一片闪存(bank0)中,后续的容量在第二片闪存(bank1)中; 3、对于flash容量小于等于512KB的GD32F10x_CL和GD32F10x_HD,只使用了bank0; 4、对 于 GD32F10x_MD , 闪 存 页 大 小 为 1KB 。 GD32F10x_CL 和 GD32F10x_HD ,GD32F10x_XD,bank0的闪存页大小为2KB,bank1的闪存页大小为4KB; 5、支持32位整字或16位半字编程,页擦除和整片擦除操作;

GD32的flash结构 GD32F10x_MD

在这里插入图片描述

GD32F10x_CL,GD32F10x_HD 和 GD32F10x_XD

在这里插入图片描述

GD32的flash读操作

flash可以像普通存储空间一样直接寻址访问。

value=*(uint32_t*)FlashAddr; uint16_t IAP_ReadFlag(void) { return *(volatile uint16_t*)(FLASH_ADDR); } GD32的flash擦除操作 页擦除

每一页可以被独立擦除,步骤如下:

确保FMC_CTLx寄存器不处于锁定状态;检查FMC_STATx寄存器的BUSY位来判定闪存是否正处于擦写访问状态,若BUSY位为1,则需等待该操作结束,BUSY位变为0;置位FMC_CTLx寄存器的PER位;将待擦除页的绝对地址(0x08XX XXXX)写到FMC_ADDRx寄存器;通过将FMC_CTLx寄存器的START位置1来发送页擦除命令到FMC;等待擦除指令执行完毕,FMC_STATx寄存器的BUSY位清0;如果需要,使用DBUS读并验证该页是否擦除成功。

代码上直接调用GD的库函数即可:

void fmc_erase_page(uint32_t Page_Address) { fmc_unlock(); //fmc解锁 /* clear all pending flags */ fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR); /* erase the flash pages */ fmc_page_erase(Page_Address); /* clear all pending flags */ fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR); fmc_lock(); //fmc上锁 }

要擦除连续的几页:

void fmc_erase_pages(void) { uint32_t erase_counter; /* unlock the flash program/erase controller */ fmc_unlock(); /* clear all pending flags */ fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR); /* erase the flash pages */ for(erase_counter = 0; erase_counter fmc_unlock(); //fmc解锁 /* clear all pending flags */ fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR); /* erase whole chip */ fmc_mass_erase(); /* clear all pending flags */ fmc_flag_clear(FMC_FLAG_BANK0_END); fmc_flag_clear(FMC_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_FLAG_BANK0_PGERR); fmc_lock(); //fmc上锁 } GD32的flash写操作

往flash的某个地址写入数据前,一般要先擦除该地址。 16位半字编程:

void IAP_WriteFlag(uint16_t flag) { fmc_unlock(); fmc_page_erase(IAP_FLAG_ADDR); fmc_halfword_program(IAP_FLAG_ADDR,flag); fmc_lock(); }

32位整字编程:

void fmc_program(void) { /* unlock the flash program/erase controller */ fmc_unlock(); address = FMC_WRITE_START_ADDR; /* program flash */ while(address


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有